﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Sofire.DataComm.Net.Async
{
    /// <summary>
    /// 表示一个远程端（服务端/客户端）。
    /// </summary>
    public interface IRemote
    {
        /// <summary>
        /// 获取当前远程端的唯一标识符。
        /// </summary>
        Guid Guid { get; }
        /// <summary>
        /// 获取当前远程端的接入时间。
        /// </summary>
        DateTime AcceptTime { get; }
        /// <summary>
        /// 获取或设置与此异步套接字操作关联的用户或应用程序对象。
        /// </summary>
        object UserToken { get; set; }

        /// <summary>
        /// 使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Full"/> 发送一个  <see cref="System.Int32"/>  和 <see cref="System.String"/> 到服务端。
        /// </summary>
        /// <param name="intValue">发送的整形。</param>
        /// <param name="stringValue">发送的字符串。</param>
        void Send(int intValue, string stringValue);
        /// <summary>
        /// 使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Full"/> 发送一个  <see cref="System.Int32"/>  和 <see cref="System.String"/> 到服务端。
        /// </summary>
        /// <param name="intValue">发送的整形。</param>
        /// <param name="stringValue">发送的字符串。</param>
        /// <param name="userToken">与发送操作关联的用户自定义数据。</param>
        void Send(int intValue, string stringValue, object userToken);
        /// <summary>
        /// 使用默认的编码格式和 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Full"/> 发送 <see cref="System.String"/> 到服务端。
        /// </summary>
        /// <param name="value">发送的字符串。</param>
        void Send(string value);
        /// <summary>
        /// 使用默认的编码格式和 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Full"/> 发送 <see cref="System.String"/> 到服务端。
        /// </summary>
        /// <param name="value">发送的字符串。</param>
        /// <param name="userToken">与发送操作关联的用户自定义数据。</param>
        void Send(string value, object userToken);

        /// <summary>
        /// 使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Full"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        void Send(byte[] buffer);
        /// <summary>
        /// 指定与发送操作关联的用户自定义数据，使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Full"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="userToken">与发送操作关联的用户自定义数据。</param>
        void Send(byte[] buffer, object userToken);
        /// <summary>
        /// 使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Full"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="offset">数据缓冲区中操作开始位置处的偏移量，以字节为单位。</param>
        /// <param name="count">可在缓冲区中发送或接收的最大数据量（以字节为单位）。</param>
        void Send(byte[] buffer, int offset, int count);
        /// <summary>
        /// 指定与发送操作关联的用户自定义数据，使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Full"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="offset">数据缓冲区中操作开始位置处的偏移量，以字节为单位。</param>
        /// <param name="count">可在缓冲区中发送或接收的最大数据量（以字节为单位）。</param>
        /// <param name="userToken">与发送操作关联的用户自定义数据。</param>
        void Send(byte[] buffer, int offset, int count, object userToken);

        /// <summary>
        /// 使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Once"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        void OnceSend(byte[] buffer);
        /// <summary>
        /// 指定与发送操作关联的用户自定义数据，使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Once"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="userToken">与发送操作关联的用户自定义数据。</param>
        void OnceSend(byte[] buffer, object userToken);
        /// <summary>
        /// 使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Once"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="offset">数据缓冲区中操作开始位置处的偏移量，以字节为单位。</param>
        /// <param name="count">可在缓冲区中发送或接收的最大数据量（以字节为单位）。</param>
        void OnceSend(byte[] buffer, int offset, int count);
        /// <summary>
        /// 指定与发送操作关联的用户自定义数据，使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.Once"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="offset">数据缓冲区中操作开始位置处的偏移量，以字节为单位。</param>
        /// <param name="count">可在缓冲区中发送或接收的最大数据量（以字节为单位）。</param>
        /// <param name="userToken">与发送操作关联的用户自定义数据。</param>
        void OnceSend(byte[] buffer, int offset, int count, object userToken);

        /// <summary>
        /// 使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.None"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        void NoneSend(byte[] buffer);
        /// <summary>
        /// 指定与发送操作关联的用户自定义数据，使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.None"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="userToken">与发送操作关联的用户自定义数据。</param>
        void NoneSend(byte[] buffer, object userToken);
        /// <summary>
        /// 使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.None"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="offset">数据缓冲区中操作开始位置处的偏移量，以字节为单位。</param>
        /// <param name="count">可在缓冲区中发送或接收的最大数据量（以字节为单位）。</param>
        void NoneSend(byte[] buffer, int offset, int count);
        /// <summary>
        /// 指定与发送操作关联的用户自定义数据，使用 <see cref="Sofire.DataComm.Net.Async.ReceiveMode.None"/> 发送数据到服务端。
        /// </summary>
        /// <param name="buffer">数据缓冲区。</param>
        /// <param name="offset">数据缓冲区中操作开始位置处的偏移量，以字节为单位。</param>
        /// <param name="count">可在缓冲区中发送或接收的最大数据量（以字节为单位）。</param>
        /// <param name="userToken">与发送操作关联的用户自定义数据。</param>
        void NoneSend(byte[] buffer, int offset, int count, object userToken);

        /// <summary>
        /// 将当前远程端标志为已断开。该方法不会立即断开远程端，在下次接收时将会断开此远程端。
        /// </summary>
        void Shutdown();
    }
}
